import { Context, Next } from 'koa';
import { AppContext, UserType } from '@/types';
import logger from '@/utils/logger';

/**
 * 租户数据隔离中间件
 * 确保所有数据查询和操作都包含租户ID过滤
 */
export default async function tenantIsolation(ctx: Context, next: Next) {
  const appCtx = ctx as AppContext;

  // 检查是否有租户上下文
  if (!appCtx.state.tenant && !appCtx.state.user) {
    ctx.throw(401, '缺少租户或用户上下文');
  }

  // 超级管理员可以跳过租户隔离
  if (appCtx.state.user?.type === UserType.SUPER_ADMIN) {
    logger.debug('超级管理员跳过租户隔离检查');
    await next();
    return;
  }

  // 对于租户用户，确保操作在其租户范围内
  if (appCtx.state.user && !appCtx.state.tenant) {
    // 如果用户已登录但没有租户上下文，从用户信息获取
    if (appCtx.state.user.tenantId) {
      logger.debug(`从用户信息获取租户ID: ${appCtx.state.user.tenantId}`);
    } else {
      ctx.throw(403, '用户未关联租户');
    }
  }

  // 挂载租户查询帮助函数到 context
  appCtx.getTenantId = () => {
    if (appCtx.state.user?.type === UserType.SUPER_ADMIN) {
      return '000000'; // 超级管理员返回特殊租户ID
    }
    return appCtx.state.tenant?.id || appCtx.state.user?.tenantId || null;
  };

  await next();
}

/**
 * 扩展 Context 类型以包含帮助函数
 */
declare module 'koa' {
  interface Context {
    getTenantId?: () => string | null;
  }
}

